package com.googlecode.horncomb.organ.srvc;

import java.util.Collection;
import java.util.List;

import com.googlecode.horncomb.organ.Group;
import com.googlecode.horncomb.organ.Person;

public interface GroupService {
	// -----------------------------------------------------------
	// get

	/**
	 * 根据Id获取组织
	 * @param groupId
	 * @return 组织
	 */
	public Group getById(String groupId);

	/**
	 * 获得组织负责人
	 * @param groupId
	 *            组织Id
	 * @param personNature
	 *            人员类型
	 * @param membershipNature
	 *            成员关系类型
	 * @return 返回找到的组织负责人
	 */
	public Person getGroupMaster(String groupId, String personNature,
			String membershipNature);

	/**
	 * 创建组织信息
	 * @param Group
	 *            新组织对象
	 */
	public void create(Group group);

	/**
	 * 更新组织信息
	 * @param Group
	 *            组织对象
	 */
	public void update(Group group);

	/**
	 * 根据组织Id删除组织
	 * @param groupId
	 *            数据库组织唯一标识
	 * @param deleted
	 *            是否真正删除. 用于标识是否真正删除，或者只是置为无效.
	 */
	public void removeById(String groupId, boolean deleted);

	// -----------------------------------------------------------
	// countMembers

	/**
	 * 统计人数.
	 * @param groupId
	 *            组织Id.
	 * @param memberNatures
	 *            成员类型.
	 * @param membershipNatures
	 *            关系类型.
	 * @return 人数.
	 */
	public int countMembers(String groupId, String[] memberNatures,
			String[] membershipNatures);

	/**
	 * 统计人数.
	 * @param groupIds
	 *            组织Id.
	 * @param memberNatures
	 *            成员类型.
	 * @param membershipNatures
	 *            关系类型.
	 * @return 人数.
	 */
	public int countMembers(Collection<String> groupIds,
			String[] memberNatures, String[] membershipNatures);

	// -----------------------------------------------------------
	// findMembers

	/**
	 * 查找人员
	 * @param groupId
	 *            组织Id.
	 * @param memberNatures
	 *            成员类型.
	 * @param membershipNatures
	 *            关系类型.
	 * @return 找到的人员类表.
	 */
	public List<? extends Person> findMembers(String groupId,
			String[] memberNatures, String[] membershipNatures);

	/**
	 * 查找人员
	 * @param groupIds
	 *            组织Id.
	 * @param memberNatures
	 *            成员类型.
	 * @param membershipNatures
	 *            关系类型.
	 * @return 找到的人员类表.
	 */
	public List<? extends Person> findMembers(Collection<String> groupIds,
			String[] memberNatures, String[] membershipNatures);

	// -----------------------------------------------------------
	// countTargets

	/**
	 * 获取源组织关联的目标组织个数.
	 * @param sourceId
	 *            源组织Id
	 * @param targetNatures
	 *            目标组织类型. 可以为空，表示所有类型.
	 * @param relationNatures
	 *            关系类型. 可以为空，表示所有类型。
	 * @return 组织个数
	 */
	public int countTargets(String sourceId, String[] targetNatures,
			String[] relationNatures);

	/**
	 * 获取源组织关联的目标组织个数.
	 * @param sourceIds
	 *            源组织Id
	 * @param targetNatures
	 *            目标组织类型. 可以为空，表示所有类型.
	 * @param relationNatures
	 *            关系类型. 可以为空，表示所有类型。
	 * @return 组织个数
	 */
	public int countTargets(Collection<String> sourceIds,
			String[] targetNatures, String[] relationNatures);

	// -----------------------------------------------------------
	// findTargets

	/**
	 * 获取指定类型的目标组织
	 * @param sourceId
	 *            源组织Id.
	 * @param targetNatures
	 *            目标组织类型. 可以为空，表示所有类型.
	 * @param relationNatures
	 *            关系类型. 可以为空，表示所有类型。
	 * @return 目标组织列表.
	 */
	public List<? extends Group> findTargets(String sourceId,
			String[] targetNatures, String[] relationNatures);

	/**
	 * 获取指定类型的目标组织
	 * @param sourceIds
	 *            源组织Id.
	 * @param targetNatures
	 *            目标组织类型. 可以为空，表示所有类型.
	 * @param relationNatures
	 *            关系类型. 可以为空，表示所有类型。
	 * @return 目标组织列表.
	 */
	public List<? extends Group> findTargets(Collection<String> sourceIds,
			String[] targetNatures, String[] relationNatures);

	// -----------------------------------------------------------
	// countSources

	/**
	 * 获取源组织关联的源组织个数.
	 * @param targetId
	 *            目标组织Id.
	 * @param sourceNatures
	 *            源组织类型. 可以为空，表示所有类型.
	 * @param relationNatures
	 *            关系类型. 可以为空，表示所有类型。
	 * @return 组织个数.
	 */
	public int countSources(String targetId, String[] sourceNatures,
			String[] relationNatures);

	/**
	 * 获取源组织关联的源组织个数.
	 * @param targetIds
	 *            目标组织Id.
	 * @param sourceNatures
	 *            源组织类型. 可以为空，表示所有类型.
	 * @param relationNatures
	 *            关系类型. 可以为空，表示所有类型。
	 * @return 组织个数.
	 */
	public int countSources(Collection<String> targetIds,
			String[] sourceNatures, String[] relationNatures);

	// -----------------------------------------------------------
	// findSources
	/**
	 * 获取指定类型的源组织
	 * @param targetId
	 *            目标组织Id.
	 * @param sourceNatures
	 *            源组织类型. 可以为空，表示所有类型.
	 * @param relationNatures
	 *            关系类型. 可以为空，表示所有类型。
	 * @return 源组织列表
	 */
	public List<? extends Group> findSources(String targetId,
			String[] sourceNatures, String[] relationNatures);

	/**
	 * 获取指定类型的源组织
	 * @param targetIds
	 *            目标组织Id.
	 * @param sourceNatures
	 *            源组织类型. 可以为空，表示所有类型.
	 * @param relationNatures
	 *            关系类型. 可以为空，表示所有类型。
	 * @return 源组织列表
	 */
	public List<? extends Group> findSources(Collection<String> targetIds,
			String[] sourceNatures, String[] relationNatures);
}
